#ifndef CLIENT_H
#define CLIENT_H

#include <QObject>
#include <QHostAddress>

#include "../network/networkmanager.h"
#include "../logging/logger.h"

class Client : public QObject
{
    Q_OBJECT

public:
    explicit Client(QObject *parent = nullptr);
    ~Client();
    
    // 连接到远程服务器
    bool connectToServer(const QString &host, quint16 port);
    
    // 断开连接
    void disconnectFromServer();
    
    // 发送鼠标事件
    bool sendMouseEvent(int x, int y, int button, bool pressed);
    
    // 发送键盘事件
    bool sendKeyboardEvent(int key, bool pressed);
    
    // 请求屏幕数据
    bool requestScreenData();
    
    // 发送身份验证请求
    bool authenticate(const QString &username, const QString &password);
    
    // 检查连接状态
    bool isConnected() const;

    // 屏幕更新控制
    bool startScreenUpdates(int fps = 10);
    void stopScreenUpdates();
    bool isReceivingScreenUpdates() const;

    // 文件传输
    bool sendFile(const QString &filePath);

signals:
    // 连接状态变化信号
    void connectionStatusChanged(bool connected);
    
    // 身份验证结果信号
    void authenticationResult(bool success, const QString &message);
    
    // 屏幕数据更新信号
    void screenDataUpdated(const QByteArray &imageData, int width, int height);
    
    // 错误信号
    void errorOccurred(const QString &errorMsg);
    
    // 文件传输信号
    void fileSendProgress(qint64 sent, qint64 total);
    void fileSendFinished(bool success, const QString &msg);

private slots:
    // 处理网络数据接收
    void onDataReceived(MessageType type, const QJsonObject &data);
    
    // 处理网络错误
    void onNetworkError(const QString &errorMsg);

private:
    // 发送文件传输完成消息
    bool sendFileFinishMessage(const QString &transferId, const QString &fileName, qint64 fileSize, int totalBlocks, const QByteArray &fileChecksum);
    
    NetworkManager *networkManager;
    
    bool authenticated;
    QString serverHost;
    quint16 serverPort;
    bool receivingScreenUpdates;
};

#endif // CLIENT_H 